package com.design.yjx.strategy;

/**
 * @author yuanjianxin
 * @date 2017/8/2 10:55
 * 超类，所有子类的共有属性和行为方法都可在此类中定义
 */
public abstract class Duck {

    //可能会变化的行为，抽象出来一个动作接口
    private FlyBehavior flyBehavior;
    private QuackBehavior quackBehavior;

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    //叫的方法，只关注接口，不关注实现，实现取决于用什么实现类
    public void quack() {
        quackBehavior.quack();
    }

    //同上
    public void fly() {
        flyBehavior.fly();
    }

    //所有鸭子都会游泳
    public void swim() {
        System.out.println("鸭子会游泳!");
    }

    //不同鸭子外观不同，所有用抽象性方法，子类自己实现
    public abstract void display();


}
